package com.huayi.datagovernance.utils.date;

import cn.hutool.core.date.*;
import cn.hutool.core.lang.Console;
import org.junit.Test;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 日期时间对象-DateTime 接口示例
 * @author wuch
 * @version 1.0
 * @date 2021/4/12 18:07
 */
public class DateUtilDemo {

    /**
     * 转换
     * Date、long、Calendar之间的相互转换
     */
    @Test
    public void test1(){
        //当前时间
        Date date = DateUtil.date();
        System.out.println("date：" + date);
        //当前时间
        Date date2 = DateUtil.date(Calendar.getInstance());
        System.out.println("date2：" + date2);
        //当前时间
        Date date3 = DateUtil.date(System.currentTimeMillis());
        System.out.println("date3：" + date3);
        //当前时间字符串，格式：yyyy-MM-dd HH:mm:ss
        String now = DateUtil.now();
        System.out.println("date3：" + now);
        //当前日期字符串，格式：yyyy-MM-dd
        String today= DateUtil.today();
        System.out.println("date3：" + today);
    }

    /**
     * 字符串转日期
     * DateUtil.parse方法会自动识别一些常用格式，包括：
     *
     * 1.yyyy-MM-dd HH:mm:ss
     * 2.yyyy-MM-dd
     * 3.HH:mm:ss
     * 4.yyyy-MM-dd HH:mm
     * 5.yyyy-MM-dd HH:mm:ss.SSS
     */
    @Test
    public void test2(){
        String dateStr = "2021-02-12";
        Date date = DateUtil.parse(dateStr);
        Console.log(date.toString());//2021-02-12 00:00:00

        //我们也可以使用自定义日期格式转化：
        Date date1 = DateUtil.parse(dateStr, "yyyy-MM-dd");
        Console.log(date1.toString());//2021-02-12 00:00:00
        Date date2 = DateUtil.parse(dateStr, DatePattern.NORM_DATE_FORMAT);
        Console.log(date2.toString());//2021-02-12 00:00:00

        //格式化日期输出
        //结果 2021/02/12
        String format = DateUtil.format(date, "yyyy/MM/dd");
        Console.log(format);
        //常用格式的格式化，结果：2021-02-12
        String formatDate = DateUtil.formatDate(date);
        Console.log(formatDate);

        //结果：2021-02-12 00:00:00
        String formatDateTime = DateUtil.formatDateTime(date);
        Console.log(formatDateTime);

        //结果：00:00:00
        String formatTime = DateUtil.formatTime(date);
        Console.log(formatTime);
    }

    /**
     * 获取Date对象的某个部分
     */
    @Test
    public void test3(){
        Date date = DateUtil.date();
        //获得年的部分
        int year = DateUtil.year(date);
        Console.log(year);
        //获得月份，从0开始计数
        int month = DateUtil.month(date);
        Console.log(month);
        //获得月份枚举
        Month monthEnum = DateUtil.monthEnum(date);
        Console.log(monthEnum);
        //获得日
        int day = DateUtil.dayOfMonth(date);
        Console.log(day);
        //获得时
        int hour = DateUtil.hour(date, true);
        Console.log(hour);
        //获得分
        int minute = DateUtil.minute(date);
        Console.log(minute);
        //获得秒
        int second = DateUtil.second(date);
        Console.log(second);
    }

    /**
     * 常用方法
     * 计算年龄
     * 有的时候我们需要获得每天的开始时间、结束时间，每月的开始和结束时间等等
     */
    @Test
    public void test4(){
//        生日转为年龄，计算法定年龄
        DateTime pdata = DateUtil.parse("1995-4-19 05:22:32");
        int age = DateUtil.ageOfNow(pdata);
        int age1 = DateUtil.ageOfNow("1995-4-19 05:22:32");
        Console.log(age+"\n"+age1);
//        计算相对于dateToCompare的年龄，长用于计算指定生日在某年的年龄
        int age2 = DateUtil.age(pdata, DateUtil.parse("2020-5-19 05:22:32"));
        Console.log(age2);
//      一天的开始时间，结果：1995-04-19 00:00:00
        DateTime beginOfDay = DateUtil.beginOfDay(pdata);
        Console.log(beginOfDay);
//      一天的结束时间，结果：1995-04-19 23:59:59
        DateTime endOfDay = DateUtil.endOfDay(pdata);
        Console.log(endOfDay);
//        获取某月的开始时间，结果：1995-04-01 00:00:00
        DateTime beginOfMonth = DateUtil.beginOfMonth(pdata);
        Console.log(beginOfMonth);
//        当前时间的时间戳（秒）
        long currentSeconds = DateUtil.currentSeconds();
        Console.log(currentSeconds);
    }

    /**
     * 日期时间偏移(加减)
     * 日期或时间的偏移指针对某个日期增加或减少分、小时、天等等，达到日期变更的目的
     */
    @Test
    public void test5(){
        String dateStr = "2017-03-01 22:33:23";
        Date date = DateUtil.parse(dateStr);

        //结果：2017-03-03 22:33:23
        Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);
        Console.log(newDate);

        //偏移天，结果：2017-03-04 22:33:23
        DateTime offsetDay = DateUtil.offsetDay(date, 3);
        Console.log(offsetDay);

        //偏移小时，结果：2017-03-01 19:33:23
        DateTime offsetHour = DateUtil.offsetHour(date, -3);
        Console.log(offsetHour);

        //偏移月，结果：2017-03-01 19:33:23
        DateTime offsetMonth = DateUtil.offsetMonth(date, -3);
        Console.log(offsetMonth);

        //偏移分钟，结果：2017-03-01 19:33:23
        DateTime offsetMinute = DateUtil.offsetMinute(date, 3);
        Console.log(offsetMinute);

        //针对当前时间，提供了简化的偏移方法（例如昨天、上周、上个月等）
        //昨天
        DateUtil.yesterday();
        //明天
        DateUtil.tomorrow();
        //上周
        DateUtil.lastWeek();
        //下周
        DateUtil.nextWeek();
        //上个月
        DateUtil.lastMonth();
        //下个月
        DateUtil.nextMonth();

        //日期范围生成器 包括开始和结束时间
        DateTime begin = DateUtil.parse("2020-12-12");
        DateTime end = DateUtil.parse("2021-2-12");
        List<DateTime> dateTimes = DateUtil.rangeToList(begin, end, DateField.MONTH);
        System.out.println("range->: "+ dateTimes);
    }

    /**
     * 日期时间差
     * 有时候我们需要计算两个日期之间的时间差（相差天数、相差小时数等等）
     */
    @Test
    public void test6(){
        String dateStr1 = "2017-03-01 22:33:23";
        Date date1 = DateUtil.parse(dateStr1);

        String dateStr2 = "2017-04-01 23:33:23";
        Date date2 = DateUtil.parse(dateStr2);

        //相差天数，31天
        long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
        long betweenDay2 = DateUtil.betweenDay(date1, date2, true);
        Console.log(betweenDay);

        //相差小时，-745  isAbs 是否保留绝对值
        long betweenHour = DateUtil.between(date2, date1, DateUnit.HOUR, false);
        Console.log(betweenHour);

        //相差的毫秒数
        long betweenMs = DateUtil.betweenMs(date2, date1);
        Console.log(betweenMs);
    }
}
